from random import randint

from django import http
from django.http import HttpResponse
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from apps.verifications import constants
from django_redis import get_redis_connection


from libs.captcha.captcha import captcha

#
# 图形验证码
class ImageCodeView(View):
    def get(self,request,uuid):
        # 生成图片验证码 返回图片内容和图片
        text,image = captcha.generate_captcha()
        # 保存图片验证码设置过期时间
        redis_client = get_redis_connection('verify_image_code')
        redis_client.setex('img_%s' % uuid, constants.IMAGE_CODE_REDIS_EXPIRES, text)
        # 响应图片验证码
        return http.HttpResponse(image, content_type='image/jpg')
#

# 短信验证码
class SMSCodeView(View):
    def get(self,request,mobile):
        # 解析校验参数 - -mobile不用校验
        uuid = request.GET.get('image_code_id')
        image_code = request.GET.get('image_code')
        # 2 校验图形验证码如果正确发送验证码, 不正确直接返回
        # 2.1 根据uuid 去redis数据库查询 图片验证码
        image_redis_client = get_redis_connection('verify_image_code')
        redis_img_code = image_redis_client.get('img_%s' % uuid)
        # 判断服务器返回的为空
        if redis_img_code is None:
            return JsonResponse({'code': '4001','errmsg': '图片验证码失效了'})
        # 如果有值 删除redis服务器上的图形验证码
        image_redis_client.delete('img_%s' % uuid)
        # 和前端传过来的进行做对比
        # 千万注意: 在redis取出来的是 bytes 类型不能直接做对比 decode()
        # 返回Json数据
        if redis_img_code.decode().lower() != image_code.lower():
            return JsonResponse({'code': '4001', 'errmsg': '输入短信验证码有误'})
        # 3 生成短信验证码, redis - 存储 并设置过期时间
        sms_code = '%06d' % randint(0,999999)
        sms_redis_client = get_redis_connection("sms_code")
        sms_redis_client.setex("sms_%s" % mobile, 300, sms_code)
        # 发短信--------容联运
        # 建立异步服务
        from celery_tasks.sms.tasks import send_sms_code_ccp
        send_sms_code_ccp.delay(mobile,sms_code)
        print('原始文件的短信码',sms_code)
        # send_flag = redis_conn.get('send_flag_%s' % mobile)
        # 如果同一用户已经有短信的验证码了 将提示发送频繁
        # # if send_flag:
        # #     return http.JsonResponse({'code': 'RETCODE.THROTTLINGERR', 'errmsg': '发送短信过于频繁'})
        # sms_redis_client.setex("sms_%s" % mobile, constants.MOBIL_CODE_REDIS_EXPIRES, sms_code)
        # 设置延迟发送时间 1的位置可以随便写
        # # redis_conn.setex('send_flag_%s' % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        # 告诉前端短信发送完毕
        return JsonResponse({'code': '0', 'errmsg': '发送短信成功'})


